#pragma once  // 防止头文件被重复包含

#include <pthread.h>  // 包含POSIX线程库，提供互斥锁功能

// Mutex类：互斥锁的封装类，提供基本的加锁解锁操作
class Mutex
{
public:
    // 构造函数：接收一个pthread互斥锁指针
    // 注意：这里不负责互斥锁的创建，只是管理已存在的锁
    Mutex(pthread_mutex_t *lock):lock_(lock)
    {}

    // Lock方法：封装了pthread_mutex_lock，用于加锁
    // 如果锁已被其他线程持有，该调用会阻塞直到获取到锁
    void Lock()
    {
        pthread_mutex_lock(lock_);
    }

    // Unlock方法：封装了pthread_mutex_unlock，用于解锁
    // 释放互斥锁，允许其他线程获取锁
    void Unlock()
    {
        pthread_mutex_unlock(lock_);
    }

    // 析构函数：这里不负责互斥锁的销毁
    // 因为锁的内存是在外部管理的
    ~Mutex()
    {}

private:
    pthread_mutex_t *lock_;  // 存储互斥锁指针
};

// LockGuard类：RAII风格的互斥锁管理器
// 利用构造函数和析构函数的特性，自动管理锁的生命周期
class LockGuard
{
public:
    // 构造函数：创建Mutex对象并立即加锁
    // 这确保了在对象构造完成时，锁已经被获取
    LockGuard(pthread_mutex_t *lock):mutex_(lock)
    {
        mutex_.Lock();  // 在构造时自动加锁
    }

    // 析构函数：自动解锁
    // 当LockGuard对象离开作用域时，会自动调用析构函数完成解锁
    // 这保证了即使在有异常发生的情况下，锁也能被正确释放
    ~LockGuard()
    {
        mutex_.Unlock();  // 在析构时自动解锁
    }

private:
    Mutex mutex_;  // 持有一个Mutex对象
    // 禁用拷贝构造和赋值操作（虽然代码中没有明确写出）
    // 因为锁的所有权不应该被复制或转移
};